//
//  ChatMessageCell.swift
//  TestIos
//
//  Created by 李亚东 on 2025/11/4.
//  Copyright © 2025 Liyadong. All rights reserved.
//

import UIKit
import SnapKit

class ChatMessageCell: UITableViewCell {
    
    // MARK: - UI Components
    private let bubbleView: UIView = {
        let view = UIView()
        view.layer.cornerRadius = 16
        view.layer.masksToBounds = true
        // 默认所有角都有圆角，后续会根据消息类型调整
        view.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner, .layerMinXMaxYCorner, .layerMaxXMaxYCorner]
        return view
    }()
    
    private let messageLabel: UILabel = {
        let label = UILabel()
        label.numberOfLines = 0
        label.font = UIFont.systemFont(ofSize: 16)
        label.textColor = .black
        return label
    }()
    
    private let loadingIndicator: UIActivityIndicatorView = {
        let indicator = UIActivityIndicatorView(style: .gray)
        indicator.hidesWhenStopped = true
        return indicator
    }()
    
    private let loadingContainer: UIView = {
        let view = UIView()
        return view
    }()
    
    private let thinkingLabel: UILabel = {
        let label = UILabel()
        label.text = "正在思考..."
        label.font = UIFont.systemFont(ofSize: 16)
        label.textColor = .black
        label.numberOfLines = 1
        return label
    }()
    
    // MARK: - Properties
    private var messageType: MessageType = .user
    
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        setupUI()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // MARK: - Setup
    private func setupUI() {
        selectionStyle = .none
        backgroundColor = .clear
        
        contentView.addSubview(bubbleView)
        bubbleView.addSubview(messageLabel)
        bubbleView.addSubview(loadingContainer)
        loadingContainer.addSubview(loadingIndicator)
        loadingContainer.addSubview(thinkingLabel)
        
        // 使用 SnapKit 设置初始布局约束（具体约束在configure中设置）
        bubbleView.snp.makeConstraints { make in
            make.top.equalToSuperview().offset(8)
            make.bottom.equalToSuperview().offset(-8)
        }
        
        messageLabel.snp.makeConstraints { make in
            make.edges.equalToSuperview().inset(UIEdgeInsets(top: 12, left: 16, bottom: 12, right: 16))
        }
        
        // loadingContainer 的约束：让它占据与 messageLabel 相同的位置和大小
        // 这样 loading 气泡的高度就会等于一行文字消息的高度
        loadingContainer.snp.makeConstraints { make in
            make.edges.equalTo(messageLabel) // 与 messageLabel 完全一致，包括上下 padding
        }
        
        loadingIndicator.snp.makeConstraints { make in
            make.left.equalToSuperview()
            make.centerY.equalToSuperview()
            // 图标高度设置为字体的行高（16pt 字体的行高约 19-20pt）
            make.width.height.equalTo(20)
        }
        
        thinkingLabel.snp.makeConstraints { make in
            make.left.equalTo(loadingIndicator.snp.right).offset(8)
            make.right.equalToSuperview()
            make.centerY.equalToSuperview()
        }
    }
    
    // MARK: - Configuration
    func configure(with message: ChatMessage) {
        messageType = message.type
        
        // 根据消息类型使用 SnapKit 重新设置布局和样式
        if message.type == .user {
            // 用户消息不显示loading
            loadingContainer.isHidden = true
            messageLabel.isHidden = false
            
            // 用户消息：右侧对齐，蓝色气泡
            // 宽度自适应文本内容，但最大不超过屏幕宽度减去左边距50pt和右边距16pt
            // 右上角不要圆角
            let screenWidth = UIScreen.main.bounds.width
            let maxWidth = screenWidth - 50 - 16 - 32 // 屏幕宽度 - 左边距50 - 右边距16 - 左右内边距32
            
            // 设置 preferredMaxLayoutWidth 以优化自动布局计算
            messageLabel.preferredMaxLayoutWidth = maxWidth
            
            // 设置文本内容
            messageLabel.text = message.content
            
            // 触发布局计算，获取文本实际宽度
            messageLabel.setNeedsLayout()
            messageLabel.layoutIfNeeded()
            
            // 计算文本实际需要的宽度（加上左右内边距）
            let textSize = messageLabel.sizeThatFits(CGSize(width: maxWidth, height: .greatestFiniteMagnitude))
            let actualContentWidth = min(textSize.width, maxWidth)
            let bubbleWidth = actualContentWidth + 32 // 加上左右内边距（16*2）
            
            bubbleView.snp.remakeConstraints { make in
                make.top.equalToSuperview().offset(8)
                make.bottom.equalToSuperview().offset(-8)
                make.right.equalToSuperview().offset(-16)
                make.width.equalTo(bubbleWidth).priority(.high) // 设置实际宽度，但允许在必要时调整
                make.left.greaterThanOrEqualToSuperview().offset(50) // 确保左边距至少50pt
            }
            
            // 设置圆角：除了右上角，其他三个角都有圆角
            bubbleView.layer.maskedCorners = [
                .layerMinXMinYCorner,  // 左上角
                .layerMinXMaxYCorner, // 左下角
                .layerMaxXMaxYCorner  // 右下角
            ]
            
            bubbleView.backgroundColor = UIColor(red: 0.2, green: 0.6, blue: 1.0, alpha: 1.0)
            messageLabel.textColor = .white
        } else {
            // AI消息：左右边距相等，宽度与屏幕一致
            // 左上角不要圆角
            bubbleView.snp.remakeConstraints { make in
                make.top.equalToSuperview().offset(8)
                make.bottom.equalToSuperview().offset(-8)
                make.left.equalToSuperview().offset(16)
                make.right.equalToSuperview().offset(-16)
            }
            
            // 设置圆角：除了左上角，其他三个角都有圆角
            bubbleView.layer.maskedCorners = [
                .layerMaxXMinYCorner,  // 右上角
                .layerMinXMaxYCorner,  // 左下角
                .layerMaxXMaxYCorner   // 右下角
            ]
            
            bubbleView.backgroundColor = UIColor(red: 0.95, green: 0.95, blue: 0.95, alpha: 1.0)
            messageLabel.textColor = .black
            
            // 根据loading状态显示不同内容
            if message.isLoading {
                // 显示loading状态
                loadingContainer.isHidden = false
                messageLabel.isHidden = true
                loadingIndicator.startAnimating()
            } else {
                // 显示正常消息内容
                loadingContainer.isHidden = true
                messageLabel.isHidden = false
                messageLabel.text = message.content
                loadingIndicator.stopAnimating()
            }
        }
    }
    
    // 更新消息内容（用于打字机效果）
    func updateContent(_ content: String) {
        // 更新内容时，确保显示messageLabel，隐藏loading
        loadingContainer.isHidden = true
        messageLabel.isHidden = false
        loadingIndicator.stopAnimating()
        
        messageLabel.text = content
        
        // 设置 preferredMaxLayoutWidth 以优化自动布局计算
        if messageType == .user {
            // 用户消息：根据屏幕宽度计算最大宽度
            let screenWidth = UIScreen.main.bounds.width
            let maxWidth = screenWidth - 50 - 16 - 32 // 屏幕宽度 - 左边距50 - 右边距16 - 左右内边距32
            messageLabel.preferredMaxLayoutWidth = maxWidth
        } else {
            // AI消息：全宽显示
            let bubbleWidth = bubbleView.bounds.width > 0 ? bubbleView.bounds.width : UIScreen.main.bounds.width - 32
            messageLabel.preferredMaxLayoutWidth = bubbleWidth - 32 // 减去左右内边距（16*2）
        }
        
        // 立即触发布局计算，确保高度正确
        // 这很重要：必须在高度更新后再滚动，避免文字被裁剪
        contentView.setNeedsLayout()
        contentView.layoutIfNeeded()
    }
}

